#include "wifi_manager.h"
#include "esp_log.h"
#include "string.h"

#define WIFI_SSID            "HW"        
#define WIFI_PASS            "12345678"
// 最大重试次数
#define MAX_RETRY            5

/**
 * 日志标签
 */
static const char* TAG = "WIFI_MANAGER";

/**
 * WiFi事件处理函数
 * 处理WiFi连接，断开和获取IP事件
 */
static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
    // 获取WiFiManager实例
    WiFiManager* manager = (WiFiManager*) arg;

    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        // 尝试连接WiFi
        esp_wifi_connect();
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        if (manager->retry_num < MAX_RETRY) {
            // 重新连接WiFi
            esp_wifi_connect();
            manager->retry_num++;
            ESP_LOGI(TAG, "重新连接到WiFi");
        } else {
            xEventGroupSetBits(manager->event_group, WIFI_FAIL_BIT);
            ESP_LOGI(TAG, "WiFi连接失败");
        }
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        // 获取IP事件数据
        ip_event_got_ip_t* event = (ip_event_got_ip_t*)event_data;
        ESP_LOGI(TAG, "WiFi连接成功，IP: " IPSTR, IP2STR(&event->ip_info.ip));
        // 重置连接次数
        manager->retry_num = 0;
        // 设置WiFi连接成功位
        xEventGroupSetBits(manager->event_group, WIFI_CONNECTED_BIT);
    }
}

void wifi_manger_init(WiFiManager* manager) {
    // 创建事件组
    manager->event_group = xEventGroupCreate();
    // 初始化重试次数
    manager->retry_num = 0;

    // 初始化网络接口
    ESP_ERROR_CHECK(esp_netif_init());
    // 创建默认事件循环
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    // 创建默认的WiFi STA
    esp_netif_create_default_wifi_sta();

    // 默认WiFi配置
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    // 初始化WiFi
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    // 注册WiFi事件处理器
    ESP_ERROR_CHECK(esp_event_handler_instance_register(
        WIFI_EVENT,
        ESP_EVENT_ANY_ID,
        &event_handler,
        manager,
        &manager->instance_any_id
    ));
    // 注册IP事件处理器
    ESP_ERROR_CHECK(esp_event_handler_instance_register(
        IP_EVENT,
        IP_EVENT_STA_GOT_IP,
        &event_handler,
        manager,
        &manager->instance_got_ip
    ));
}

void wifi_manger_start(WiFiManager* manager) {
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = WIFI_SSID,
            .password = WIFI_PASS,
            // 设置默认认证模式
            .threshold.authmode = WIFI_AUTH_WPA2_PSK,
            // 支持WAP3
            .sae_pwe_h2e = WPA3_SAE_PWE_BOTH
        }
    };
    // 设置WiFi模式位STA
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    // 设置WiFi配置
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
    // 启动WiFi
    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "初始化WiFi完成");

    // 等待WiFi连接成功或失败
    EventBits_t bits = xEventGroupWaitBits(
        manager->event_group,
        WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
        pdFALSE,
        pdFALSE,
        portMAX_DELAY
    );

    if (bits & WIFI_CONNECTED_BIT) {
        ESP_LOGI(TAG, "WiFi连接成功：%s", WIFI_SSID);
    } else if (bits & WIFI_FAIL_BIT) {
        ESP_LOGI(TAG, "WiFi连接失败：%s", WIFI_SSID);
    } else {
        ESP_LOGI(TAG, "未知错误");
    }
}


void wifi_manger_stop(WiFiManager* manager) {
    // 注销事件处理器
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
        IP_EVENT,
        IP_EVENT_STA_GOT_IP,
        manager->instance_got_ip
    ));
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
        WIFI_EVENT,
        ESP_EVENT_ANY_ID,
        manager->instance_any_id
    ));
    // 删除事件组件
    vEventGroupDelete(manager->event_group);
}